#ifndef _DB_CONNECTOR_H_
#define _DB_CONNECTOR_H_

/*
* Al insertar este include se requieren las siguientes opciones
* en el compilador:
* 		-I/usr/local/mysql/include -Os -fno-common -D_P1003_1B_VISIBLE 
*         		-DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT
* 		-L/usr/local/mysql/lib -lmysqlclient -lz -lm -lmygcc
*/
#include <mysql.h>

/*
* Definiciones que evitan que clases con mayor nivel de abstraccion
* deban usar estructuras propias de mysql
*/
#define DB_RES MYSQL_RES
#define DB_ROW MYSQL_ROW
#define DB_CONNECTOR MYSQL

#define db_num_rows(x) mysql_num_rows(x)
#define db_fetch_row(x) mysql_fetch_row(x)
#define db_free_result(x) mysql_free_result(x)

/**
* Clase que permite conectarse a una base de datos y acceder o modificar
* la informacion almacenada en ella. Abstrae para clase superiores del tipo
* de base de datos utilizada (mysql, oracle, sql server, etc.)
*
* @author Carlos Rodriguez Dominguez
*/
class DBConnector {
private:
	DB_CONNECTOR* connector; /**< Conector para la db */
	char* user; /**< Nombre de usuario para la conexion a la db */
	char* password; /**< Password asociado al nombre de usuario */
	char* host; /**< Host donde se encuentra la db */
	char* db; /**< Nombre de la db a la que se desea acceder */
	
public:
	
	/**
	* Constructor
	*
	* @param host Host
	* @param user Nombre de usuario
	* @param password Password
	* @param db Nombre de la base de datos
	*/
	DBConnector(const char* host, const char* user, const char* password, const char* db);
	
	/**
	* Destructor
	*/
	~DBConnector();
	
	/**
	* Abre una conexion con la base de datos
	*
	* @return True si se pudo abrir la conexion o False en caso contrario
	*/
	bool open();
	
	/**
	* Cierra la conexion con la base de datos
	*/
	void close();
	
	/**
	* Realiza un query sobre la base de datos
	*
	* @param command Comando para el query
	* @return Resultado
	*/
	DB_RES* query(const char* command);
	
	/**
	* Actualiza la base de datos (inserta, modifica o elimina datos)
	*
	* @param command Comando para la actualizacion
	* @return True si pudo actualizarse la db o False en caso contrario
	*/
	bool update(const char* command);
	
	/**
	* Obtiene un identificador unico para la columna de una tabla
	*
	* @param table Tabla
	* @param col Columna
	* @return Identificador unico para la columna de la tabla
	*/
	int getUID(const char* table, const char* col);
};

#endif
